﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0046)http://www.vovisoft.com/dotNET/Bai13/Bai13.htm -->
<HTML><HEAD><TITLE>.NET Lesson 13</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META http-equiv=Content-Language content=vi>
<META content="MSHTML 6.00.2716.2200" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="Visual Basic, VB Programming in Vietnamese, Vovisoft, VB6, VB Tutorials, Learn Visual Basic, Internet, Unicode, Vietnamese VB tutorials, Database, Asp, Java, Javascript, VBscript, FrontPage 2000, XML, Ms Office 2000" 
name=keywords></HEAD>
<BODY leftMargin=0 topMargin=0 marginheight="0" marginwidth="0">
<CENTER><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="Bai 13_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma>
<H2><FONT face=Tahoma color=#800000>Bài 13</FONT></H2>
<H2><FONT face=Tahoma color=#800000>DataGrid (phần I)</FONT></H2></CENTER>
<BLOCKQUOTE>
  <BLOCKQUOTE><B>DataGrid</B> trong .NET tuy có các chức năng giống như trong 
    VB6 nhưng đã được nâng cấp vượt bực và cách dùng thay đổi rất nhiều nên coi 
    như ta phải học lại từ đầu.<BR><BR>Cách dùng thông thường nhất của một 
    DataGrid trong VB6 là hiển thị một <B>Table</B> các records trong dạng một 
    spreadsheet, mỗi hàng (<B>row</B>) chứa các datafields của một record và mỗi 
    cột (<B>column</B>) có header cho biết là datafield gì.<BR><BR>Nói cho đúng 
    ra, nằm sau lưng mỗi DataGrid là một <B>Recordset</B>, tức là một <I>Set of 
    Records</I> mà ta chọn lấy từ database. Table chẳng qua cũng là một 
    Recordset trong trường hợp tổng quát khi ta không dùng Clause <B>WHERE</B> 
    trong SQL command, thí dụ như "Select * from Authors". 
    <H3><FONT color=green>Giới thiệu ADO.NET</FONT></H3>Trong .NET, ý niệm 
    Recordset đã được thay thế bằng <B>Dataset</B>. Trong một bài tới ta sẽ học 
    chi tiết về <B>Data Access trong VB.NET</B>, nên hiện giờ chỉ cần biết đại 
    khái về Dataset để dùng trong các thí dụ áp dụng DataGrid.<BR><BR>Trong 
    <B>ADO (ActiveX Data Object) của VB6</B> ta dùng <B>Connection</B> để nối 
    chương trình áp dụng của mình với cơ sở dữ liệu và lấy ra một Recordset. Cái 
    connection ấy vẫn được giữ nguyên trong khi chương trình ta làm việc với 
    Recordset. Trong <B>ADO.NET của .NET</B> sau khi thiết lập connection với cơ 
    sở dữ liệu ta copy một hay nhiều Recordset vào Dataset. Các Recordset nầy có 
    thể có mối liên hệ <B>Master/Slave Relation</B> với nhau. Thí dụ như 
    Invoice/InvoiceDetails, trong đó các InvoiceDetails liên hệ với Invoice qua 
    InvoiceID chẳng hạn, tức là InvoiceID là Primary Key của Invoice và cũng là 
    Foreign Key của InvoiceDetails . Sau đó ta chỉ làm việc với Dataset mà thôi. 
    Cái connection coi như đã bị cắt đứt. Do đó Dataset được xem như là 
    <B>disconnected database</B> nho nhỏ nằm trong bộ nhớ.<BR><BR>Chắc chắn bạn 
    sẽ không an lòng và hỏi nếu có hai người cùng copy các Recordset ra dùng thì 
    liệu khi update ta có bị mất những sửa đổi nào không. Đó là vấn đề khó khăn 
    cổ điển về Multiuser lúc hai người copy cùng một record ra để Edit. Người 
    Update record sau có thể viết chồng lên Edited Record của người trước khiến 
    cho những thay đổi người trước đánh vào bị mất.<BR><BR>Cái hay của ADO.NET 
    là khi ta muốn Update Dataset, connection sẽ được tự động nối lại và dataset 
    sẽ được <B>reconciled</B> với cơ sỡ dữ liệu. Chữ <B>reconcile</B> là một từ 
    kỹ thuật trong kế toán mà ta hay dùng để nói đến việc so sánh các chi tiết 
    tiền ra vô của một trương mục giữa sổ sách chúng ta giữ và bảng báo cáo của 
    nhà băng để điều chỉnh lại các con số trong sổ sách của chúng ta cho giống 
    như của nhà băng. Nếu ta giữ sổ sách chính xác thì sự khác biệt chỉ là những 
    transactions (món tiền ra, vô) nhà băng làm mà ta chưa biết như chi phí dịch 
    vụ của nhà băng, thuế tài chánh .v.v.. Bên trong Dataset có chứa các trị số 
    cũ của datafields để dùng vào việc so sánh khi Reconcile các 
    records.<BR><BR>Có lẽ bạn thắc mắc tại sao Microsoft lại bày đặt thêm ra 
    chuyện ADO.NET với ý niệm disconnected database chi cho mệt, như có người 
    trào phúng: <I>"Mỗi năm lại thêm một kỹ thuật mới về Data Access từ 
    Microsoft"</I>. Lý do chính là để áp dụng trong Internet. Vì mọi connection 
    trên mạng đều nhất thời, sau khi hoàn tất transaction thì hai bên chia tay 
    tạm biệt. Do đó rất khó cho ta giữ một connection thường trực như trong ADO. 
    Nên nhớ rằng sau nầy lần lần các áp dụng trên Internet sẽ thay thế các giải 
    pháp (Applications) ta dùng trong mạng cục bộ. Ngay cả nếu chỉ muốn dùng 
    Application trong nội bộ ta cũng có thể dùng Intranet. Như thế ta chỉ cần 
    triển khai một Application duy nhất để dùng cho cả người ngoài (Internet), 
    lẫn nội bộ (Intranet).<BR><BR>Dataset của ADO.NET cho ta các lợi ích thực 
    tiển như:<BR>
    <UL>
      <LI>Hoàn toàn trong bộ nhớ: Một Table trong Dataset là một Array of Rows, 
      nên ta có thể dùng thẳng (direct access) một record bằng cách nói đến cái 
      Row chứa nó, chớ không cần phải dùng MoveNext, MovePrev,.v.v. 
      <LI>Làm nhẹ công tác của cơ sỡ dữ kiện chính: Vai trò của Dataset đối với 
      cơ sỡ dữ kiện chính (Oracle, Informix, SQLServer .v.v.) cũng giống như 
      mười năm trước đây ta bắt đầu dùng Workstations để làm nhẹ công tác của 
      Mainframe computer. Chuyện nào Workstation làm được thì ta giao cho nó, 
      vừa nhanh, vừa linh động, khỏi cần phiền đến Mainframe. Tất cả mọi công 
      tác sửa đổi dữ kiện đều được thực hiện trong Dataset. 
      <LI>Dataset có thể được biểu diển bằng một <B>XML (eXtensible Marked 
      Language)</B>: Ta có thể dùng các công cụ của XML để làm việc với Dataset, 
      trao đổi Dataset giữa các computers trên mạng dưới dạng XML, thậm chí có 
      thể chứa một cơ sở dữ kiện nho nhỏ dưới dạng một XML. </LI></UL>
    <H3><FONT color=green>Dùng thẳng XML làm cơ sở dữ liệu</FONT></H3>Chúng ta 
    muốn hiển thị các records của một Table trong Dataset để biểu diễn các chức 
    năng của DataGrid. Hôm nay mình chơi nổi, nên sẽ tạo một XML file để dùng nó 
    làm một Dataset, thay vì trích một Table từ một SQLServer hay Access 
    database.<BR><BR>Trước hết bạn hãy khởi động một dự án mới, đặt tên nó là 
    <B>AlarmList</B>. Kế đó, trong Solution Explorer rename tên của file 
    <B>Form1.vb</B> thành <B>frmAlarmList.vb</B> và thay đổi property Text của 
    form thành <B>Alarm List</B>, property Name của form thành 
    <B>frmAlarmList</B>. <BR><BR><IMG height=484 
    src="Bai 13_files/AlarmList.gif" width=901><BR><BR>Lưu ý là chỉ khi bạn thay 
    đổi property Name của form bạn mới thấy tên của Class của form thay đổi từ 
    <B>Form1</B> ra <B>frmAlarmList</B> như ta thấy trong hình dưới đây: 
    <BLOCKQUOTE><IMG height=154 src="Bai 13_files/frmAlarmList.gif" 
    width=354></BLOCKQUOTE>Nếu bây giờ bạn right click lên tên của project 
    AlarmList trong Solution Explorer và chọn PopupMenuItem <B>Properties</B>, 
    dialog <B>AlarmList Property Pages</B> hiện ra. Trong ComboBox của 
    <B>Startup object</B> vẫn còn có chữ <B>Form1</B>. Bạn có thể click lên cái 
    cái tam giác bên phải của hộp Combobox để select chữ <B>frmAlarmList</B> để 
    chỉ định nó làm Startup form. <BR><BR><IMG height=432 
    src="Bai 13_files/Projproperties.gif" width=859><BR><BR>Trong chương trình 
    nầy ta lo về an ninh và muốn hiển thị các cánh cửa trong tòa nhà bị mở cửa 
    ngoài giờ làm việc. Nếu áp dụng ngoài đời thì Real-time Data sẽ được thu 
    thập từ các dụng cụ gọi là Data Acquisition hay Telemetry Monitoring Devices 
    và báo cáo cho hệ thống trung ương để cập nhật hóa Dataset mà ta dùng để 
    hiển thị trong DataGrid.<BR><BR>Bạn hãy click IDE menu command <B>Project | 
    Add New Item</B> rồi chọn <B>XML File</B> và đặt tên nó là 
    <B>AlarmList.xml</B> như trong hình dưới đây: 
    <BLOCKQUOTE><IMG height=399 src="Bai 13_files/XMLItem.gif" 
    width=531></BLOCKQUOTE>Kế đó ta sẽ đánh vào data của AlarmList. Hàng đầu của 
    XML file là một Processing Instruction (huấn thị cách xử lý) tuyên bố rằng 
    ta dùng tiêu chuẩn xml version 1.0 với Unicode encoding utf-8. 
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=red>&lt;?</FONT><FONT color=magenta>xml</FONT><FONT color=green> version<FONT color=blue>=</FONT>"1.0" encoding<FONT color=blue>=</FONT>"utf-8"</FONT><FONT color=red>?&gt;</FONT>
</PRE></FONT></TD></TR></TBODY></TABLE>Phần chính của cả cái XML file nằm 
    giữa cặp Tag <B>&lt;alarmlist&gt;</B> (gọi là opening Tag) và 
    <B>&lt;/alarmlist&gt;</B> (gọi là closing Tag). Ta gọi alarmlist là 
    <B>Element</B>. Bên trong chính alarmlist là nhiều Elements tên 
    <B>alarm</B>. Các Element alarm không cần có closing Tag vì chúng không có 
    chứa gì bên trong. Trong trường hợp nầy ta chấm dứt opening Tag bằng <FONT 
    color=red>/&gt;</FONT>. Tuy nhiên mỗi Element alarm có chứ nhiều 
    <B>Attributes</B> như priority, datetime, pointid .v.v.. bên trong opening 
    Tag của nó. Mỗi Attribute có dạng 
    <B>TêncủaAttribute="valuecủaAttribute"</B>. Lưu ý valuecủaAttribute nằm giữa 
    dấu ngoặc kép hay ngoặc đơn.<BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=red>&lt;</FONT><FONT color=blue>alarmlist</FONT><FONT color=green></FONT><FONT color=red>&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"3" datetime<FONT color=blue>=</FONT>"20/7/2001 16:33:11" pointid<FONT color=blue>=</FONT>"401-2-9" description<FONT color=blue>=</FONT>"Level 1 backroom door" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"19" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"false" ackn<FONT color=blue>=</FONT>"true"</FONT><FONT color=red>/&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"3" datetime<FONT color=blue>=</FONT>"20/7/2001 18:47:33" pointid<FONT color=blue>=</FONT>"402-8-7" description<FONT color=blue>=</FONT>"Level 1 kitchen side door" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"6" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"false" ackn<FONT color=blue>=</FONT>"false"</FONT><FONT color=red>/&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"2" datetime<FONT color=blue>=</FONT>"20/7/2001 16:21:40" pointid<FONT color=blue>=</FONT>"401-6-7" description<FONT color=blue>=</FONT>"Side door of third level" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"14" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"false" ackn<FONT color=blue>=</FONT>"true"</FONT><FONT color=red>/&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"1" datetime<FONT color=blue>=</FONT>"20/7/2001 15:19:37" pointid<FONT color=blue>=</FONT>"401-2-3" description<FONT color=blue>=</FONT>"Car park rear entrance" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"16" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"false" ackn<FONT color=blue>=</FONT>"false"</FONT><FONT color=red>/&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"1" datetime<FONT color=blue>=</FONT>"20/7/2001 17:18:27" pointid<FONT color=blue>=</FONT>"401-1-3" description<FONT color=blue>=</FONT>"Front door of tenth level" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"25" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"false" ackn<FONT color=blue>=</FONT>"true"</FONT><FONT color=red>/&gt;</FONT>
   <FONT color=red>&lt;</FONT><FONT color=blue>alarm</FONT><FONT color=green> priority<FONT color=blue>=</FONT>"2" datetime<FONT color=blue>=</FONT>"20/7/2001 16:21:30" pointid<FONT color=blue>=</FONT>"401-5-4" description<FONT color=blue>=</FONT>"Back door of nineth level" statusvalue<FONT color=blue>=</FONT>"Open" diagram<FONT color=blue>=</FONT>"5" alarm<FONT color=blue>=</FONT>"true" isolate<FONT color=blue>=</FONT>"false" fault<FONT color=blue>=</FONT>"true" ackn<FONT color=blue>=</FONT>"false"</FONT><FONT color=red>/&gt;</FONT>
<FONT color=red>&lt;/</FONT><FONT color=blue>alarmlist</FONT><FONT color=red>&gt;</FONT>
</PRE></FONT></TD></TR></TBODY></TABLE><BR><BR>Bây giờ click MenuCommand 
    <B>XML | Create Schema</B> như dưới đây: 
    <BLOCKQUOTE><IMG height=262 src="Bai 13_files/createSchema.gif" 
    width=712></BLOCKQUOTE>Chú ý là MenuCommand XML chỉ hiện ra khi ta làm việc 
    với XML file của project (doubleclick tên AlarmList.xml trong Solution 
    Explorer). Một Schema của file AlarmList.xml, tên <B>AlarmList.xsd</B>, sẽ 
    hiện ra trong Solution Explorer và bạn có thể doubleclick tên AlarmList.xsd 
    để làm việc với file ấy.<BR><BR>.NET IDE cho ta hình của Schema để ta có thể 
    Edit dễ dàng. Thông thường, IDE chỉ xác nhận thứ nào là Element (có chữ 
    <FONT color=blue><B>E</B></FONT> nằm bên trái), thứ nào là Attribute (có chữ 
    <FONT color=blue><B>A</B></FONT> nằm bên trái). Còn về Datatype thì nó nhắm 
    mắt nói mọi thứ là <B>string</B>. Do đó ta phải sửa đổi lại theo ý mình, để 
    nói Attribute priority là <B>integer</B> và các Attributes alarm, isolate, 
    fault, ackn là <B>Boolean</B>. 
    <BLOCKQUOTE><IMG height=421 src="Bai 13_files/Schema.gif" 
    width=831></BLOCKQUOTE>AlarmList.xsd cũng là một XML file, nó chứa chi tiết 
    về cấu trúc của AlarmList.xml và Datatype (loại data ) của từng Element và 
    Attribute trong file AlarmList.xml. Nếu bạn click Tab <B>XML</B> kế bên Tab 
    <B>DataSet</B> phía dưới bạn sẽ thấy hình dưới đây: 
    <BLOCKQUOTE><IMG height=471 src="Bai 13_files/SchemaXML.gif" 
    width=857></BLOCKQUOTE>
    <H3><FONT color=green>Tạo DataSet từ XML Schema</FONT></H3>Bây giờ click trở 
    lại Tab <B>DataSet</B>, đoạn dùng MenuCommand <B>Schema | Generate 
    Dataset</B> để tạo ra cấu trúc của một DataSet dựa vào Schema AlarmList.xsd. 

    <BLOCKQUOTE><IMG height=470 src="Bai 13_files/GenerateDS.gif" 
    width=584></BLOCKQUOTE>Một file tên <B>AlarmList.vb</B> sẽ được tạo ra trong 
    source code folder của project. Nó định nghĩa và cung cấp mọi method cần 
    thiết để dùng cho DataSet loại <B>alarmlist</B>. <BR><BR>
    <H3><FONT color=green>Dùng DataGrid</FONT></H3>Để hiển thị data trong 
    DataGrid, ta có thể bind (buộc) nó vào Dataset, Array hay Collection. Thật 
    ra, nếu bạn muốn, bạn có thể câu cả DataGrid vào một Set của Listbox Items. 
    DataGrid trong .NET có thể hiển thị cả Master/Detail records nên nó đảm nhận 
    luôn chức năng của MSHFlexGrid trong VB6. 
    <H3><FONT color=blue>Bind DataSource của DataGrid vào một 
    Dataset</FONT></H3>Ta hãy trở lại form frmAlarmList. Đặt lên nó một DataGrid 
    tên <B>DataGrid1</B> và thêm một Button tên <B>BtnLoadXMLData</B> với Text 
    <B>Load XML Data</B>. Doubleclick lên Button BtnLoadXMLData để cho vào các 
    hàng codes sau đây:<BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=green>' Declare a Dataset of type alarmlist from AlarmList.vb that was created from the schema AlarmList.xsd</FONT>
<FONT color=blue>Dim</FONT> DS <FONT color=blue>As</FONT> alarmlist 
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> BtnLoadXMLData_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) _
                                                    <FONT color=blue>Handles</FONT> BtnLoadXMLData.Click 
   <FONT color=green>' Instantiate a DataSet type alarmlist</FONT>
   DS = <FONT color=blue>New</FONT> alarmlist() 
   <FONT color=green>' Load the XML data from file AlarmList.xml in the source code folder. Note that the program EXE resides</FONT>
   <FONT color=green>' in the bin subfolder</FONT>
   DS.ReadXml("../AlarmList.xml") 
   <FONT color=green>' Bind the Datagrid DataSource to this new DataSet table alarm</FONT>
   DataGrid1.DataSource = DS.alarm 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE>Bây giờ bạn có thể chạy chương trình 
    của chúng ta. Click nút <B>Load XML Data</B> bạn sẽ thấy như sau: 
    <BLOCKQUOTE><IMG height=300 src="Bai 13_files/DisplayDS.gif" 
    width=752></BLOCKQUOTE>
    <H3><FONT color=blue>Hiển thị các cột data theo ý mình</FONT></H3>Trong hình 
    trên tất cả datafields của mỗi record được hiển thị với cùng bề ngang và với 
    datafield name của chúng dùng làm đề tựa của mỗi cột. Ta có thể dùng 
    <B>DataGridTableStyle</B> object để hiển thị các cột data theo ý mình bằng 
    cách gọi Sub <B>AddCustomDataTableStyle()</B> (có code liệt kê dưới đây) 
    trong Sub BtnLoadXMLData_Click. 
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> AddCustomDataTableStyle() 
   <FONT color=green>' Instantiate a DataGridTableStyle object</FONT>
   <FONT color=blue>Dim</FONT> ts1 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTableStyle() 
   ts1.MappingName = "alarm"  <FONT color=green>' Name of data table</FONT>
   ts1.AlternatingBackColor = Color.Beige  <FONT color=green>' Make alternating row beige</FONT>
   ts1.RowHeadersVisible = <FONT color=blue>False</FONT>  <FONT color=green>' Make RowHeaders (on the left of DataGrid) invisible</FONT>
   <FONT color=green>' Only two types are supported: Text and Boolean</FONT>
   <FONT color=green>' Add the display field in order of display from left to right</FONT>
   <FONT color=green>'Just ignore a datafield if you don't want to display it</FONT>
   <FONT color=blue>Dim</FONT> boolCol1 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridBoolColumn()  <FONT color=green>' Boolean</FONT>
   boolCol1.MappingName = "ackn"  <FONT color=green>' Name of datafield</FONT>
   boolCol1.HeaderText = "Ackn" 
   boolCol1.Width = 35 
   ts1.GridColumnStyles.Add(boolCol1) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol1 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn()  <FONT color=green>' Text</FONT>
   TextCol1.MappingName = "priority" 
   TextCol1.HeaderText = "Prio" 
   TextCol1.Width = 30 
   ts1.GridColumnStyles.Add(TextCol1) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol2 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn() 
   TextCol2.MappingName = "datetime" 
   TextCol2.HeaderText = "Time" 
   TextCol2.Width = 110 
   ts1.GridColumnStyles.Add(TextCol2) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> boolCol2 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridBoolColumn() 
   boolCol2.MappingName = "alarm" 
   boolCol2.HeaderText = "ALM" 
   boolCol2.Width = 30 
   ts1.GridColumnStyles.Add(boolCol2) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> boolCol3 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridBoolColumn() 
   boolCol3.MappingName = "isolate" 
   boolCol3.HeaderText = "ISO" 
   boolCol3.Width = 30 
   ts1.GridColumnStyles.Add(boolCol3) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> boolCol4 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridBoolColumn() 
   boolCol4.MappingName = "fault" 
   boolCol4.HeaderText = "FLT" 
   boolCol4.Width = 30 
   ts1.GridColumnStyles.Add(boolCol4) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol3 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn() 
   TextCol3.MappingName = "pointid" 
   TextCol3.HeaderText = "PointID" 
   TextCol3.Width = 70 
   ts1.GridColumnStyles.Add(TextCol3) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol4 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn() 
   TextCol4.MappingName = "description" 
   TextCol4.HeaderText = "Description" 
   TextCol4.Width = 210 
   ts1.GridColumnStyles.Add(TextCol4) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol5 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn() 
   TextCol5.MappingName = "statusvalue" 
   TextCol5.HeaderText = "Status/Value" 
   TextCol5.Width = 150 
   ts1.GridColumnStyles.Add(TextCol5) 
   <FONT color=green>'</FONT>
   <FONT color=blue>Dim</FONT> TextCol6 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> DataGridTextBoxColumn() 
   TextCol6.MappingName = "diagram" 
   TextCol6.HeaderText = "Diag" 
   TextCol6.Width = 40 
   ts1.GridColumnStyles.Add(TextCol6) 
   <FONT color=green>' Now add the DataGridTableStyle object to Collection TableStyles of Datagrid1</FONT>
   DataGrid1.TableStyles.Add(ts1) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Trong code bên trên, ta 
    thấy <B>DataGridTableStyle</B> tên <B>ts1</B> chứa một collection of 
    <B>GridColumnStyles</B>. Muốn hiển thị datafield nào của record ta tạo cho 
    nó một cột hoặc là <B>Text</B> hoặc là <B>Boolean</B>. Nếu là Text thì ta 
    instantiate một object loại <B>DataGridTextBoxColumn</B>, nếu là Boolean thì 
    ta instantiate một object loại 
    <B>DataGridBoolColumn</B>.<BR><BR><B>MappingName</B> của 
    DataGridTextBoxColumn hay DataGridBoolColumn là tên của Datafield. 
    <B>HeaderText</B> là Tiêu đề nằm phía trên của cột datafield ấy. 
    <B>Width</B> là bề ngang của cột mà bạn phải thí nghiệm các con số vài lần 
    cho nó hiển thị vừa vặn.<BR><BR>Cột nào ta cho vô trước thì hiển thị bên 
    trái, vô sau thì nằm bên phải. Nếu ta cố ý không nhắc đến một datafield nào, 
    thì nó không được hiển thị. Sau khi chuẩn bị DataGridTableStyle đầy đủ rồi, 
    ta cho nó vào Collection <B>TableStyles</B> của DataGrid1.<BR><BR>Kế đó Edit 
    property Text của DataGrid1 cho nó câu "Dùng DataGridTableStyle để hiển thị 
    theo ý mình". Chạy chương trình lại và click nút <B>Load XML Data</B> bạn sẽ 
    thấy như sau: 
    <BLOCKQUOTE><IMG height=240 src="Bai 13_files/TableStyle.gif" 
    width=752></BLOCKQUOTE><BR><BR>Bạn có thể <A 
    href="http://www.vovisoft.com/dotNET/Bai13/AlarmList.zip">tải về chương 
    trình AlarmList nầy</A> tại đây. 
    <BLOCKQUOTE><A href="http://www.vovisoft.com/"><IMG height=40 
      src="Bai 13_files/homejump.gif" width=40><A>&nbsp;&nbsp;<A 
      href="http://www.vovisoft.com/dotNET/default.asp">Học Microsoft 
      .NET</A><BR><BR></BLOCKQUOTE></FONT><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=center><FONT face=Tahoma color=#ffffff size=1>Vovisoft © 
          2000. All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=center><FONT face=Tahoma size=1>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->07 
          Apr 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="15038" --> </FONT></P></TD>
        <TD width=181><FONT face=Tahoma size=1>&nbsp;</FONT></TD>
        <TD width=258>
          <P align=center><FONT face=Tahoma size=1><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE><BR></BLOCKQUOTE></BLOCKQUOTE></BODY></HTML>
